﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;


/// <summary>
/// Summary description for ModeloAsignarMaterialesAlProyecto
/// </summary>
public class ModeloAsignarMaterialesAlProyecto
{

    Conexion conn = null;
    
    public ModeloAsignarMaterialesAlProyecto()
	{
        conn = new Conexion();
	}

    public DataTable getBodegas(String idTipoBodega)
    {
        try
        {

            DataTable dt = new DataTable();

            DataColumn c1 = new DataColumn();
            c1.ColumnName = "nombreBodega";
            DataColumn c2 = new DataColumn();
            c2.ColumnName = "idBodega";
        

            dt.Columns.Add(c1);
            dt.Columns.Add(c2);


            String query = " SELECT BODEGA.NOMBREBODEGA , BODEGA.IDBODEGA " +
                            " FROM BODEGA INNER JOIN TIPO_BODEGA ON (BODEGA.IDTIPOBODEGA = TIPO_BODEGA.IDTIPOBODEGA) " +
                            " WHERE TIPO_BODEGA.IDTIPOBODEGA = "+idTipoBodega+"";

            bool connected = conn.iniciarConexion();

            if (connected == true)
            {
                SqlDataReader rows = null;
                SqlCommand comm = new SqlCommand(query, conn.getConn());
                rows = comm.ExecuteReader();
                while (rows.Read())
                {
                    DataRow r = dt.NewRow();
                    r["nombreBodega"] = rows[0].ToString();
                    r["idBodega"] = rows[1].ToString();
                    dt.Rows.Add(r);
                }

                conn.terminarConexion();

                return dt;
            }

            else
            {

                conn.terminarConexion();
                return null;
            }
        }

        catch (Exception exc)
        {

            return null;
        }

    }

    public DataTable getMaterialesEstimados(String idProyecto)
    {
        try
        {

            DataTable dt = new DataTable();

            DataColumn c1 = new DataColumn();
            c1.ColumnName = "nombreMaterial";
            DataColumn c2 = new DataColumn();
            c2.ColumnName = "skuMaterial";
            DataColumn c3 = new DataColumn();
            c3.ColumnName = "idMaterial";
            DataColumn c4 = new DataColumn();
            c4.ColumnName = "cantidadEstimada";
            DataColumn c5 = new DataColumn();
            c5.ColumnName = "nombreUnidadDeMedida";

            dt.Columns.Add(c1);
            dt.Columns.Add(c2);
            dt.Columns.Add(c3);
            dt.Columns.Add(c4);
            dt.Columns.Add(c5);


            String query = " SELECT ESTIMACIONMATERIAL.IDTIPOMATERIAL , ESTIMACIONMATERIAL.CANTIDADESTIMADA, TIPO_MATERIAL.NOMBRETIPOMATERIAL , TIPO_MATERIAL.SKUTIPOMATERIAL, UNIDAD_DE_MEDIDA.NOMBREUNIDADDEMEDIDA" +
                            " FROM TIPO_MATERIAL  INNER JOIN ESTIMACIONMATERIAL ON (TIPO_MATERIAL.IDTIPOMATERIAL = ESTIMACIONMATERIAL.IDTIPOMATERIAL) " +
                            " INNER JOIN UNIDAD_DE_MEDIDA ON (UNIDAD_DE_MEDIDA.IDUNIDADDEMEDIDA = TIPO_MATERIAL.IDUNIDADDEMEDIDA)" +
                            " WHERE ESTIMACIONMATERIAL.IDPROYECTO = " + idProyecto + "";

            bool connected = conn.iniciarConexion();

            if (connected == true)
            {
                SqlDataReader rows = null;
                SqlCommand comm = new SqlCommand(query, conn.getConn());
                rows = comm.ExecuteReader();
                while (rows.Read())
                {
                    DataRow r = dt.NewRow();
                    r["nombreMaterial"] = rows[2].ToString();
                    r["skuMaterial"] = rows[3].ToString();
                    r["idMaterial"] = rows[0].ToString();
                    r["cantidadEstimada"] = rows[1].ToString();
                    r["nombreUnidadDeMedida"] = rows[4].ToString();
                    dt.Rows.Add(r);
                }

                conn.terminarConexion();

                return dt;
            }

            else
            {

                conn.terminarConexion();
                return null;
            }
        }
        catch (Exception exc)
        {

            return null;
        }

    }

    public DataTable getMaterialesEnBodega(String idProyecto , String idBodega, String idProyViendo)
    {
        try
        {

            DataTable dt = new DataTable();

            DataColumn c1 = new DataColumn();
            c1.ColumnName = "nombreMaterial";
            DataColumn c2 = new DataColumn();
            c2.ColumnName = "skuMaterial";
            DataColumn c3 = new DataColumn();
            c3.ColumnName = "idMaterial";
            DataColumn c4 = new DataColumn();
            c4.ColumnName = "cantidadReal";
            DataColumn c5 = new DataColumn();
            c5.ColumnName = "nombreUnidadDeMedida";

            dt.Columns.Add(c1);
            dt.Columns.Add(c2);
            dt.Columns.Add(c3);
            dt.Columns.Add(c4);
            dt.Columns.Add(c5);


            String query = " SELECT MATERIAL_REAL.IDTIPOMATERIAL , MATERIAL_REAL.CANTIDADREAL, TIPO_MATERIAL.NOMBRETIPOMATERIAL , TIPO_MATERIAL.SKUTIPOMATERIAL, UNIDAD_DE_MEDIDA.NOMBREUNIDADDEMEDIDA" +
                            " FROM TIPO_MATERIAL  INNER JOIN MATERIAL_REAL ON (TIPO_MATERIAL.IDTIPOMATERIAL = MATERIAL_REAL.IDTIPOMATERIAL) " +
                            " INNER JOIN UNIDAD_DE_MEDIDA ON (UNIDAD_DE_MEDIDA.IDUNIDADDEMEDIDA = TIPO_MATERIAL.IDUNIDADDEMEDIDA)" +
                            " INNER JOIN ESTIMACIONMATERIAL ON (ESTIMACIONMATERIAL.IDTIPOMATERIAL = MATERIAL_REAL.IDTIPOMATERIAL) " +
                            " WHERE MATERIAL_REAL.IDPROYECTO = " + idProyecto + " AND MATERIAL_REAL.IDBODEGA = "+idBodega+" AND ESTIMACIONMATERIAL.IDPROYECTO = "+idProyViendo+"";

            bool connected = conn.iniciarConexion();

            if (connected == true)
            {
                SqlDataReader rows = null;
                SqlCommand comm = new SqlCommand(query, conn.getConn());
                rows = comm.ExecuteReader();
                while (rows.Read())
                {
                    DataRow r = dt.NewRow();
                    r["nombreMaterial"] = rows[2].ToString();
                    r["skuMaterial"] = rows[3].ToString();
                    r["idMaterial"] = rows[0].ToString();
                    r["cantidadReal"] = rows[1].ToString();
                    r["nombreUnidadDeMedida"] = rows[4].ToString();
                    dt.Rows.Add(r);
                }

                conn.terminarConexion();

                return dt;
            }

            else
            {

                conn.terminarConexion();
                return null;
            }
        }
        catch (Exception exc)
        {

            return null;
        }

    }


    public DataTable getMaterialesRemanentesEnBodega(String idProyectoRemanentes, String idProyViendo)
    {
        try
        {

            DataTable dt = new DataTable();

            DataColumn c1 = new DataColumn();
            c1.ColumnName = "nombreMaterial";
            DataColumn c2 = new DataColumn();
            c2.ColumnName = "skuMaterial";
            DataColumn c3 = new DataColumn();
            c3.ColumnName = "idMaterial";
            DataColumn c4 = new DataColumn();
            c4.ColumnName = "cantidadReal";
            DataColumn c5 = new DataColumn();
            c5.ColumnName = "nombreUnidadDeMedida";

            dt.Columns.Add(c1);
            dt.Columns.Add(c2);
            dt.Columns.Add(c3);
            dt.Columns.Add(c4);
            dt.Columns.Add(c5);


            String query = " SELECT MATERIAL_REAL.IDTIPOMATERIAL , MATERIAL_REAL.CANTIDADREAL, TIPO_MATERIAL.NOMBRETIPOMATERIAL , TIPO_MATERIAL.SKUTIPOMATERIAL, UNIDAD_DE_MEDIDA.NOMBREUNIDADDEMEDIDA" +
                            " FROM TIPO_MATERIAL  INNER JOIN MATERIAL_REAL ON (TIPO_MATERIAL.IDTIPOMATERIAL = MATERIAL_REAL.IDTIPOMATERIAL) " +
                            " INNER JOIN UNIDAD_DE_MEDIDA ON (UNIDAD_DE_MEDIDA.IDUNIDADDEMEDIDA = TIPO_MATERIAL.IDUNIDADDEMEDIDA)" +
                            " INNER JOIN ESTIMACIONMATERIAL ON (ESTIMACIONMATERIAL.IDTIPOMATERIAL = MATERIAL_REAL.IDTIPOMATERIAL) " +
                            " WHERE MATERIAL_REAL.IDPROYECTO = " + idProyectoRemanentes + " AND ESTIMACIONMATERIAL.IDPROYECTO = " + idProyViendo + "";

            bool connected = conn.iniciarConexion();

            if (connected == true)
            {
                SqlDataReader rows = null;
                SqlCommand comm = new SqlCommand(query, conn.getConn());
                rows = comm.ExecuteReader();
                while (rows.Read())
                {
                    DataRow r = dt.NewRow();
                    r["nombreMaterial"] = rows[2].ToString();
                    r["skuMaterial"] = rows[3].ToString();
                    r["idMaterial"] = rows[0].ToString();
                    r["cantidadReal"] = rows[1].ToString();
                    r["nombreUnidadDeMedida"] = rows[4].ToString();
                    dt.Rows.Add(r);
                }

                conn.terminarConexion();

                return dt;
            }

            else
            {

                conn.terminarConexion();
                return null;
            }
        }
        catch (Exception exc)
        {

            return null;
        }

    }

    public DataTable getMaxMateriales(String idProyecto, String idBodega, String proyViendo)
    {
        try
        {

            DataTable dt = new DataTable();

            DataColumn c3 = new DataColumn();
            c3.ColumnName = "idMaterial";
            DataColumn c4 = new DataColumn();
            c4.ColumnName = "cantidadEstimada";
            DataColumn c5 = new DataColumn();
            c5.ColumnName = "cantidadAsignada";
            DataColumn c6 = new DataColumn();
            c6.ColumnName = "cantidadRestante";


            dt.Columns.Add(c3);
            dt.Columns.Add(c4);
            dt.Columns.Add(c5);
            dt.Columns.Add(c6);



            String query = " SELECT  MATERIAL_REAL.IDTIPOMATERIAL , MATERIAL_REAL.CANTIDADREAL " +
                            " FROM MATERIAL_REAL" +
                            " INNER JOIN ESTIMACIONMATERIAL ON (ESTIMACIONMATERIAL.IDTIPOMATERIAL = MATERIAL_REAL.IDTIPOMATERIAL) "+
                            " WHERE MATERIAL_REAL.IDPROYECTO = " + idProyecto + " AND MATERIAL_REAL.IDBODEGA = "+idBodega+" AND ESTIMACIONMATERIAL.IDPROYECTO = "+proyViendo+"";

            bool connected = conn.iniciarConexion();

            if (connected == true)
            {
                SqlDataReader rows = null;
                SqlCommand comm = new SqlCommand(query, conn.getConn());
                rows = comm.ExecuteReader();
                while (rows.Read())
                {
                    DataRow r = dt.NewRow();
                    r["idMaterial"] = rows[0].ToString();
                    r["cantidadEstimada"] = rows[1].ToString();
                    r["cantidadAsignada"] = "0";
                    r["cantidadRestante"] = rows[1].ToString();
                    dt.Rows.Add(r);
                }

                conn.terminarConexion();

                return dt;
            }

            else
            {
                conn.terminarConexion();
                return null;
            }
        }

        catch (Exception exc)
        {

            return null;
        }

    }

    public DataTable getCantidadRestanteMaterial(String idMaterial, DataTable materiales)
    {
        DataTable dt = new DataTable();
        DataColumn c1 = new DataColumn();
        c1.ColumnName = "cantidad";
        dt.Columns.Add(c1);

        if (materiales == null)
        {
            return null;
        }

        for (int i = 0; i < materiales.Rows.Count; i++)
        {
            String idMat = materiales.Rows[i]["idMaterial"].ToString();
            if (idMat == idMaterial)
            {
                int cRest = Int32.Parse(materiales.Rows[i]["cantidadRestante"].ToString()); ;
                if (cRest <= 0)
                {
                    return null;
                }

                else
                {
                    for (int j = 1; j <= cRest; j++)
                    {
                        DataRow r = dt.NewRow();
                        r["cantidad"] = j.ToString();
                        dt.Rows.Add(r);
                    }

                    return dt;
                }
            }

        }

        return null;
    }


    public DataTable cargaInicial(String idProyecto)
    {
        try
        {

            DataTable dt = new DataTable();

            DataColumn c3 = new DataColumn();
            c3.ColumnName = "idMaterial";
            DataColumn c4 = new DataColumn();
            c4.ColumnName = "skuMaterial";
            DataColumn c5 = new DataColumn();
            c5.ColumnName = "nombreMaterial";
            DataColumn c6 = new DataColumn();
            c6.ColumnName = "cantidadAsignada";
            DataColumn c7 = new DataColumn();
            c7.ColumnName = "nombreBodega";
            DataColumn c8 = new DataColumn();
            c8.ColumnName = "idBodega";
            DataColumn c10 = new DataColumn();
            c10.ColumnName = "cantidadNueva";
            DataColumn c11 = new DataColumn();
            c11.ColumnName = "cantidadRemanente";

            dt.Columns.Add(c3);
            dt.Columns.Add(c4);
            dt.Columns.Add(c5);
            dt.Columns.Add(c6);
            dt.Columns.Add(c7);
            dt.Columns.Add(c8);
            dt.Columns.Add(c10);
            dt.Columns.Add(c11);



            String query = " SELECT MATERIAL_REAL.IDTIPOMATERIAL, TIPO_MATERIAL.SKUTIPOMATERIAL, TIPO_MATERIAL.NOMBRETIPOMATERIAL , " +
                            " MATERIAL_REAL.CANTIDADREAL , BODEGA.NOMBREBODEGA , BODEGA.IDBODEGA, MATERIAL_REAL.CANTIDADREMANENTE " +
                            " FROM MATERIAL_REAL INNER JOIN TIPO_MATERIAL ON (MATERIAL_REAL.IDTIPOMATERIAL = TIPO_MATERIAL.IDTIPOMATERIAL) " +
                            " INNER JOIN BODEGA ON (MATERIAL_REAL.IDBODEGA = BODEGA.IDBODEGA) " +
                            " WHERE MATERIAL_REAL.IDPROYECTO = "+idProyecto+"";

            bool connected = conn.iniciarConexion();

            if (connected == true)
            {
                SqlDataReader rows = null;
                SqlCommand comm = new SqlCommand(query, conn.getConn());
                rows = comm.ExecuteReader();
                while (rows.Read())
                {
                    DataRow r = dt.NewRow();
                    r["idMaterial"] = rows[0].ToString();
                    r["skuMaterial"] = rows[1].ToString();
                    r["nombreMaterial"] = rows[2].ToString(); ;
                    r["cantidadAsignada"] = rows[3].ToString();
                    r["nombreBodega"] = rows[4].ToString();
                    r["idBodega"] = rows[5].ToString();
                    r["cantidadNueva"] = "0";
                    r["cantidadRemanente"] = rows[6].ToString(); ;
                    dt.Rows.Add(r);
                }

                conn.terminarConexion();

                return dt;
            }

            else
            {
                conn.terminarConexion();
                return null;
            }
        }

        catch (Exception exc)
        {

            return null;
        }
    }


    public int insertMaterialesAsignacion(String idProyecto, String filas, String idRemanentes, HttpResponse resp)
    {

        

        try
        {
            bool conectar = conn.iniciarConexion();
            if (conectar)
            {

                
                SqlCommand cmd = new SqlCommand("insertMaterialesAsignacion", conn.getConn());
                cmd.CommandType = CommandType.StoredProcedure;


                cmd.Parameters.Add(new SqlParameter("@idProyectoRemanentes",
                                                       SqlDbType.Int,
                                                       0,
                                                       "idProyectoRemanentes"
                                                    )
                                    );

                
                
                cmd.Parameters.Add(new SqlParameter("@rowsToInsert",
                                                           SqlDbType.VarChar,
                                                           4000,
                                                           "rowsToInsert"
                                                        )
                                        );

                
                cmd.Parameters.Add(new SqlParameter("@idProyecto",
                                                       SqlDbType.Int,
                                                       0,
                                                       "idProyecto"
                                                    )
                                    );

                cmd.Parameters.Add(new SqlParameter("@outParam",
                                                           SqlDbType.Int,
                                                           0,
                                                           ParameterDirection.Output,
                                                           false,
                                                           0,
                                                           0,
                                                           "outParam",
                                                           DataRowVersion.Default,
                                                           null
                                                        )
                                        );



                cmd.Parameters[0].Value = idRemanentes;
                cmd.Parameters[1].Value = filas;
                cmd.Parameters[2].Value = idProyecto;
                cmd.UpdatedRowSource = UpdateRowSource.OutputParameters;

                int per = cmd.ExecuteNonQuery();

                int result = (int)cmd.Parameters["@outParam"].Value;

                conn.terminarConexion();

                return result;
            }

            else
            {

                return -2;
            }
        }

        catch (Exception exc)
        {

            
            return -3;
        }

    }

}